﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Noris.Tools.TraceVisualiser.Components;
using Noris.Tools.TraceVisualiser.Support;
using System.Drawing;

namespace Noris.Tools.TraceVisualiser.TraceData
{
    internal class TraceGraphRow : IDataRow
    {
		#region IDataRow Members
		public GID GId { get; set; }
        /// <summary>
        /// Jméno nodu. Mělo by být unikátní, zatím ale unikátnost není kontrolována. Používá se při persistenci pointerů na řádek(řádky).
        /// GID se může při příštím reloadu dat změnit, ale NodeName by nemělo.
        /// </summary>
        public string NodeName { get; set; }
		public bool HasSubNodes { get; set; }
		public RowGraphMode RowGraph { get; set; }
		public float RowHeightMultiplier { get; set; }
		public GID ParentGId { get; set; }
        public GID NextGId { get; set; }
		public List<IDataElement> ElementList { get; set; }
		public TimeRange ElementLoadedTimeRange { get; set; }
		public bool AllElementsLoaded { get; set; }
		public RowActionType ActionOnRowDoubleClick { get; set; }
		public RowActionType ActionOnElementDoubleClick { get; set; }
		public bool ShowPrevNextIcon { get; set; }
		public bool ReloadSubNodesOnExpandNode { get; set; }
		public System.Drawing.Image Icon { get; set; }
		public ContentAlignment IconAlignment { get; set; }
		public System.Drawing.Color RowColor { get; set; }
		/// <summary>
		/// Nejmenší výška řádku grafu, v pixelech.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightTotalMinPx { get; set; }
		/// <summary>
		/// Nejvyšší výška řádku grafu, v pixelech.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightTotalMaxPx { get; set; }
		/// <summary>
		/// Typická výška jedné linky řádku (linka v MultiThread grafu odpovídá výšce jednoho elementu s UseRatio = 1.0M), u ostatních grafů jde o běžnou výšku elementu.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightLineSolidPx { get; set; }
		/// <summary>
		/// Typická výška jednoho řádku, pokud jde o řádek typu RowGraphMode.MultiTask, kde elementy mají UseRatio různé od 1.0M
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightLineFragmentPx { get; set; }
		/// <summary>
		/// Výška nejmenšího zlomku v grafu typu RowGraphMode.MultiTask, kdy jsou zobrazeny položky využívající podíl kapacity.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightMinFragmentPx { get; set; }
		/// <summary> { get; }
		/// Přídavek k výšce neděleného řádku, vyjádřený relativně k hodnotě this.RowHeightLineSolidPx (fyzická výška jedné nedělené linky).
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public decimal? RowHeightAddLineSolidRatio { get; set; }
		/// <summary> { get; }
		/// Přídavek k výšce děleného řádku, vyjádřený relativně k hodnotě this.RowHeightLineFragmentPx (fyzická výška jedné dělené linky).
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public decimal? RowHeightAddLineFragmentRatio { get; set; }
		/// <summary>
		/// Vrátí text do sloupce daného indexu.
		/// Index sloupce je odvozen od pořadí sloupce.
		/// </summary>
		/// <param name="index">Index sloupce</param>
		/// <param name="key">Klíč sloupce</param>
		public string GetColumnContent(int index, string key)
		{
			if (this.Texts != null && index >= 0 && index < this.Texts.Length)
				return this.Texts[index];
			return null;
		}
		/// <summary>
		/// Vrátí hodnotu daného sloupce, která se použije jako hodnota vstupující do řádkového filtru.
		/// Pokud se vrátí null, pak si systém načte hodnotu pomocí metody GetColumnContent().
		/// Je tak zajištěna možnost uživatelského formátování zobrazeného textu, a současně možnost filtrování podle neupravené hodnoty textu.
		/// Typicky je možno zobrazovat čas jako "12 651 ms" (vrátí metoda GetColumnContent()), ale filtrovat na hodnotu "50", což je menší!
		/// (při textovém porovnání by bylo "50" větší než "12 651 ms" !!!)
		/// Pokud není třeba toto chování podpořit, lze vždy vrátit hodnotu null.
		/// </summary>
		/// <param name="index">Index sloupce</param>
		/// <param name="key">Klíč sloupce</param>
		public string GetColumnValue(int index, string key)
		{
			if (this.Values != null && index >= 0 && index < this.Values.Length)
				return this.Values[index];
			return null;
		}
		/// <summary>
		/// Vrátí základ tooltipu pro elementy
		/// </summary>
		/// <returns></returns>
		public string ToolTipInfo()
		{
			return null;
		}
		#endregion
        #region Podpora pro texty
        public override string ToString()
		{
            return Texts.ToStringList();
		}
		internal string[] Texts;
        internal string[] Values;
        #endregion
    }
}
